#pragma once

#include <Rz/Types.h>

// Collections
#include <Rz/Collections/Array.h>
#include <Rz/Collections/Dictionary.h>
#include <Rz/Collections/IEnumerable.h>
#include <Rz/Collections/IList.h>
#include <Rz/Collections/InitializerList.h>
#include <Rz/Collections/Iterator.h>
#include <Rz/Collections/List.h>

// Diagnostics
#include <Rz/Diagnostics/Assert.h>
#include <Rz/Diagnostics/Logger.h>
#include <Rz/Diagnostics/PtrManager.h>

// Graphics/Scene/Lights
#include <Rz/Graphics/Scene/Lights/LightNode.h>
#include <Rz/Graphics/Scene/Lights/PointLightNode.h>

// Graphics/Scene
#include <Rz/Graphics/Scene/CameraNode.h>
#include <Rz/Graphics/Scene/Node.h>
#include <Rz/Graphics/Scene/MeshNode.h>
#include <Rz/Graphics/Scene/RootNode.h>

// Graphics/Render/CompositionAdapters
#include <Rz/Graphics/Render/CompositionAdapters/DeferredComposition.h>
#include <Rz/Graphics/Render/CompositionAdapters/ICompositionAdapter.h>

// Graphics/Render/Libraries/DirectX11
#ifdef RZ_COMPILER_MSVC
#	include <Rz/Graphics/Render/Libraries/DirectX11/DX11RenderDevice.h>
#	include <Rz/Graphics/Render/Libraries/DirectX11/DX11Win32Viewer.h>
#endif

// Graphics/Render/Libraries/OpenGL
#include <Rz/Graphics/Render/Libraries/OpenGL/API/GLDefinitions.h>
#include <Rz/Graphics/Render/Libraries/OpenGL/API/GLExt.h>
#include <Rz/Graphics/Render/Libraries/OpenGL/API/GLWinExt.h>

#include <Rz/Graphics/Render/Libraries/OpenGL/GL.h>
#include <Rz/Graphics/Render/Libraries/OpenGL/GLDepthStencilState.h>
#include <Rz/Graphics/Render/Libraries/OpenGL/GLEffect.h>
#include <Rz/Graphics/Render/Libraries/OpenGL/GLEffectProperty.h>
#include <Rz/Graphics/Render/Libraries/OpenGL/GLIndexBuffer.h>
#include <Rz/Graphics/Render/Libraries/OpenGL/GLArrayBuffer.h>
#include <Rz/Graphics/Render/Libraries/OpenGL/GLRasterizerState.h>
#include <Rz/Graphics/Render/Libraries/OpenGL/GLRenderDevice.h>
#include <Rz/Graphics/Render/Libraries/OpenGL/GLRenderTarget2D.h>
#include <Rz/Graphics/Render/Libraries/OpenGL/GLSamplerState.h>
#include <Rz/Graphics/Render/Libraries/OpenGL/GLTexture2D.h>
#include <Rz/Graphics/Render/Libraries/OpenGL/GLVertexArray.h>
#include <Rz/Graphics/Render/Libraries/OpenGL/GLVertexBuffer.h>
#include <Rz/Graphics/Render/Libraries/OpenGL/GLWin32Viewer.h>

// Graphics/Render/SceneVisitors
#include <Rz/Graphics/Render/SceneVisitors/ISceneVisitor.h>
#include <Rz/Graphics/Render/SceneVisitors/CullVisitor.h>

// Graphics/Render/VertexDescriptions
#include <Rz/Graphics/Render/VertexDescriptions/IVertexDescription.h>
#include <Rz/Graphics/Render/VertexDescriptions/PositionNormalColor.h>
#include <Rz/Graphics/Render/VertexDescriptions/PositionNormalTexture.h>

// Graphics/Render
#include <Rz/Graphics/Render/IArrayBuffer.h>
#include <Rz/Graphics/Render/IBindableResource.h>
#include <Rz/Graphics/Render/IBuffer.h>
#include <Rz/Graphics/Render/IDepthStencilState.h>
#include <Rz/Graphics/Render/IDeviceResource.h>
#include <Rz/Graphics/Render/IEffect.h>
#include <Rz/Graphics/Render/IEffectProperty.h>
#include <Rz/Graphics/Render/IIndexBuffer.h>
#include <Rz/Graphics/Render/IRasterizerState.h>
#include <Rz/Graphics/Render/IRenderTarget2D.h>
#include <Rz/Graphics/Render/ISamplerState.h>
#include <Rz/Graphics/Render/ITexture.h>
#include <Rz/Graphics/Render/ITexture2D.h>
#include <Rz/Graphics/Render/IUniformBuffer.h>
#include <Rz/Graphics/Render/IVertexArray.h>
#include <Rz/Graphics/Render/IVertexBuffer.h>
#include <Rz/Graphics/Render/IViewer.h>
#include <Rz/Graphics/Render/IViewerHandler.h>

#include <Rz/Graphics/Render/GBuffer.h>
#include <Rz/Graphics/Render/Geometry.h>
#include <Rz/Graphics/Render/GeometryBuilder.h>
#include <Rz/Graphics/Render/VertexElement.h>
#include <Rz/Graphics/Render/VertexDescription.h>
#include <Rz/Graphics/Render/ViewerEvents.h>
#include <Rz/Graphics/Render/ViewerState.h>
#include <Rz/Graphics/Render/Viewport.h>

// Graphics/Materials
#include <Rz/Graphics/Materials/MaterialBase.h>
#include <Rz/Graphics/Materials/PhongMaterial.h>

// Graphics/Math
#include <Rz/Graphics/Math/BoundingBox.h>
#include <Rz/Graphics/Math/BoundingSphere.h>
#include <Rz/Graphics/Math/Matrix3.h>
#include <Rz/Graphics/Math/Matrix4.h>
#include <Rz/Graphics/Math/Projection.h>
#include <Rz/Graphics/Math/Size.h>
#include <Rz/Graphics/Math/Vector2.h>
#include <Rz/Graphics/Math/Vector3.h>
#include <Rz/Graphics/Math/Vector4.h>

// Graphics/Effects
#include <Rz/Graphics/Effects/EffectBase.h>

// IO
#include <Rz/IO/File.h>
#include <Rz/IO/IStream.h>

// Utils
#include <Rz/Utils/Cryptography/CryptographyBase.h>
#include <Rz/Utils/Cryptography/OAT.h>

// .
#include <Rz/EnumBasedContainer.h>
#include <Rz/EnumFlags.h>
#include <Rz/EnumFlags.h>
#include <Rz/Event.h>
#include <Rz/IApplication.h>
#include <Rz/IFlaggable.h>
#include <Rz/IHumanReadable.h>
#include <Rz/IObject.h>
#include <Rz/ITypeWrapper.h>
#include <Rz/Math.h>
#include <Rz/Memory.h>
#include <Rz/Object.h>
#include <Rz/Ptr.h>
#include <Rz/Range.h>
#include <Rz/ReferenceCounter.h>
#include <Rz/Singleton.h>
#include <Rz/String.h>

// Standard libraries
#include <iostream>
#include <fstream>
#include <cassert>
